package com.zby.lease.web.admin.config;

import com.zby.lease.web.admin.custom.converter.StringToEnumConverterFactory;
import com.zby.lease.web.admin.custom.interceptor.AuthenticationInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    // 自动注入String到Enum的转换工厂
    @Autowired
    private StringToEnumConverterFactory stringToEnumConverterFactory;
    @Autowired
    private AuthenticationInterceptor  authenticationInterceptor;

    /**
     * 添加格式化器到注册表中
     *
     * @param registry 格式化器注册表，用于注册各种类型的格式化器
     *
     * 此方法用于向Spring框架注册一个从String到Enum的转换工厂
     * 通过这种方式，我们可以自定义字符串到枚举的转换逻辑，提高应用的灵活性
     */
    /**
     * 重写addFormatters方法以注册自定义的格式转换器
     * 此方法允许用户向Spring MVC的转换服务注册自定义的格式转换器或格式化器
     * 通过这种方式，可以定义应用程序中数据类型的全局转换规则
     *
     * @param registry FormatterRegistry实例，用于注册格式转换器或格式化器
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
        // 向注册表中添加String到Enum的转换工厂
        registry.addConverterFactory(this.stringToEnumConverterFactory);
    }
    /**
     * 配置拦截器
     *
     * 该方法用于向Spring MVC的InterceptorRegistry中添加拦截器，
     * 以定义哪些请求需要经过拦截器处理本方法主要负责配置与认证相关的拦截器，
     * 以确保只有经过认证的用户才能访问受保护的admin路径
     *
     * @param registry InterceptorRegistry实例，用于注册拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册认证拦截器，应用于所有以"/admin/"开头的路径，但排除了"/admin/login/**"路径
        // 这样可以确保只有登录请求可以不经过认证拦截器，而其他管理路径则需要认证
//        registry.addInterceptor(this.authenticationInterceptor).addPathPatterns("/admin/**").excludePathPatterns("/admin/login/**");

        registry.addInterceptor(this.authenticationInterceptor).excludePathPatterns("/admin/login/**","/**");
    }
//    /**
//     * 配置静态资源路径
//     *
//     * 该方法用于配置静态资源路径，包括静态资源文件、HTML文件等，
//     * 以定义哪些路径可以访问静态资源，以及哪些路径需要经过拦截器处理
//     *
//     * @param registry ResourceHandlerRegistry实例，用于注册静态资源处理器
//     */
//    @Override
//    public void addResourceHandlers(ResourceHandlerRegistry registry) {
//        // 配置静态资源路径，包括静态资源文件、HTML文件等
//        // 例如：将"/static/**"路径映射到classpath:/static/目录下的静态资源
//        registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/static/");
//    }

//         @Override
//         public void addCorsMappings(CorsRegistry registry) {
//             registry.addMapping("/**")
//                     .allowedOrigins("http://localhost:5173")
//                     .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
//                     .allowedHeaders("*")
//                     .allowCredentials(true)
//                     .maxAge(3600);
//         }
     }


